options(jupyter.plot_mimetypes='image/png')
options(repr.plot.width=8, repr.plot.height=6)
이건 하나하나 치는 게 너무 짜증나서 사진으로 대체하도록 하겠습니다.
library("IRdisplay")
display_png(file="picture.png")
bootstrap의 첫 번째 자리에 원래 모집단의 j 번째 값이 발견될 확률은 $\frac{1}{n}$ 이다. 그러므로 발견되지 않을 확률은 $1-\frac{1}{n}$ 이다.
bootstrap은 복원추출을 허용하므로, 역시 동일하게 $1-\frac{1}{n}$ 이다.
bootstrap sample의 각 자리에서 원래 모집단의 j 번째 값이 발견되는 사건은 모두 독립이다. 그러므로 각 사건이 일어나지 않을 확률을 모두 곱하면 어느 자리에서도 원래 모집단의 j 번째 값이 발견되지 않을 확률이 된다.
$(1-\frac{1}{n})^n$
n = 5 일 때, 원래 모집단의 j 번째 값이 bootstrap sample 안에 있을 확률은, 전체 확률인 1에서 하나도 관찰되지 않을 확률을 빼서 구할 수 있다.
$1-(1-\frac{1}{5})^5 = 1-(\frac{4}{5})^5 = 67.2\%$
n = 100 일 때,
$1-(1-\frac{1}{100})^{100} = 1-(\frac{99}{100})^{100} = 63.4\%$
n = 10000 일 때,
$1-(1-\frac{1}{10000})^{10000} = 63.2\%$
plot을 아래에 그립니다.
x = 1:100000
pr = function(x){
return (1-(1-1/x)^x)
}
plot(x, pr(x))
# 우선 store 라는 이름의 벡터를 만듭니다. 이 벡터는 10000개의 빈 공간을 가집니다.
store = rep(NA, 10000)
# store의 첫 번째 값부터 마지막 값까지 채워 넣을 겁니다.
for (i in 1:10000){
store[i] = sum(sample(1:100, rep=TRUE) ==4) > 0
# sample(1:100, rep=TRUE)
# 1부터 100까지의 값들 중에 복원추출을 통해 무작위로 뽑은
# 100개의 값들로 이뤄진 벡터를 구합니다
# sample(1:100, rep=TRUE)==4
# 그러고 난 다음에 벡터의 각 값들이 4와 같은지 비교합니다.
# 이렇게 하면 원래 숫자였던 벡터의 값들이 TRUE 혹은 FALSE가 되겠습니다.
# 예를 들어 이전엔 1 49 28... 이랬던 값들이 FALSE FALSE FALSE... 가 된다는 것이죠.
# 이 말은 쉽게 말해서, bootstrap sample이 원 모집단의 j번째 값, 여기서는 4를
# 포함하는지 아닌지 살펴보는 것입니다. 하나라도 TRUE가 있다면
# bootstrap sample은 j 번째 값을 포함하고 있는 것이겠죠.
# sum(sample(1:100, rep=TRUE)==4)
# 이제 그 FALSE와 TRUE(TRUE가 있을지는 장담할 수 없습니다. 없을 수도 있겠죠.)로 이뤄진
# 100개의 논리값들을 다 더합니다. 이 때 TRUE = 1, FALSE = 0 입니다.
# 이 값이 0이면 bootstrap sample 안에는 j 번째 값이 없는 거고
# 1 이상이면 한 번 이상 j 번째 값이 나왔다는 의미입니다.
# sum(sample(1:100, rep=TRUE)==4) > 0
# 다시 한 번 논리연산을 합니다. 위에서 논리값들을 다 더한 결과가 0보다 큰지 작은지를
# 비교하여 그 결과를 store의 i 번째 공간에 저장한다는 뜻이지요.
# store[i]는 TRUE 아니면 FALSE를 가집니다.
# TRUE 는 bootstrap sample 에서 j 번째 값이 발견 되었다는 뜻이고
# FALSE는 그렇지 않다는 뜻이겠죠.
}
# mean은 평균을 구하는 함수고, 아까 말한대로 TRUE = 1, FALSE = 0으로 간주하고 계산합니다.
# 아래 연산은 곧 bootstrap sampling을 만 번 했을 때, 그 중 j 번째 값이 하나 이상 들어있는
# sample들의 비율을 구하는 것이 되겠습니다. 결과가 대충 0.63 근처로 수렴할 것입니다.
mean(store)
k-fold cross-validation이 어떻게 적용되는지 설명하자면,
1.Randomly divide the set of observations into k groups, or folds of approximately equal size.
2.The first fold is treated as a validation set, and the method is fit on the remaining k-1 folds.
3.The mean squared error, $MSE_1$, is then computed on the observations in the held-out fold.
4.This procedure is repeated k times.
5.Each time, a different group of observations is treated as a validation set.
6.This process results in k estimates of the test error.
7.The k-fold CV estimate is computed by averaging these values,
$$CV_{(k)} = \frac{1}{k}\sum_{i=1}^{k}\ MSE_i$$자료를 크기가 서로 비슷한 k 개의 집단으로 나눈다. 첫 번째 집단을 validation set으로 삼고 나머지 집단들의 자료에 대해 fitting을 한다. fitting한 결과를 가지고 첫 번째 집단에 적용하여 MSE를 구한다. 이 과정을 마치면 validation set 을 두 번째 집단, 세 번째 집단... k 번째 집단으로 설정해가며 MSE를 각각 구한다. 이 MSE 들의 평균을 내는 것이 k-fold CV estimate 값이다.
k-fold CV가 validation set approach보다 좋은 점은
모든 data 들이 training set에 들어가기 때문에 overestimation의 위험을 줄일 수 있고
training set을 한 번만 구하는 게 아니라 여러번 구해서 mse의 평균을 내기 때문에 validation estimate의 분산을 더 줄일 수 있다.
LOOCV 보다 좋은 점은 calculation cost를 줄일 수 있다는 점이다.
1번 문제에서 구한 $\alpha$의 추정치가 얼마나 정확한지 알 수 있을까? 추정치의 표준편차를 구하면 될 것이다.
그러나 그렇게 하려면 $\alpha$의 평균을 구하기 위해서 새로운 $X$, $Y$ 를 sampling을 해야 할 것이다. 이는 만만찮은 일이기 때문에, 새로이 $X$, $Y$를 구할 것이 아니라 이미 주어진 자료에서 bootstrap sample들을 구해서 $\alpha$의 추정치의 표준편차를 구하는 방법을 택한다.
원래의 자료로 주어진 집단을 $Z$ 라고 하고, bootstrap 방법을 통해 $Z$와 크기가 같은 sample 들을 취할 때, 이것을 각각 $Z^{*1}$, $Z^{*2}$, $Z^{*3}$,...,$Z^{*B}$ 라고 하자. B는 bootsrap 방법을 적용한 횟수이다.
그러면 $Z^{*1}$, $Z^{*2}$,...,$Z^{*B}$ 에 대하여 $\hat{\alpha}^{*1}$, $\hat{\alpha}^{*2}$,...,$\hat{\alpha}^{*B}$ 를 구할 수 있다.
이제 $\hat{\alpha}$의 표준오차를 구할 수 있다.
$$SE_{B}(\hat{\alpha}) = \sqrt{\frac{1}{B-1} \sum_{r=1}^{B} (\hat{\alpha}^{*r} - \frac{1}{B} \sum_{r'=1}^{B} \hat{\alpha}^{*r'})^2}$$